package com.fruitshop.info.manager.dao;

import com.fruitshop.info.manager.domain.Fruit;

import java.io.*;
import java.util.ArrayList;
import java.util.TreeSet;
/**
 1. 数据中的增删改方法都会在数据变动后调用reSave()方法,用已保存最新的数据信息
 2. 加入了Tree集合用以实现手动排序的功能,设计两个TreeSet集合,一个已库存排序,一个已价格排序
 3. 设计了一个方法通过编号获取对象在集合中对应的索引位置
 4. 设计了一个方法,用以记录库存的变化
*/

@SuppressWarnings("all")
public class FruitDao {
    private static ArrayList<Fruit> fruits = new ArrayList<>();
    //
    private static TreeSet<Fruit> allFruits = new TreeSet<>((o1, o2) -> {
        int result = o2.getInventory() - o1.getInventory();
        result = result == 0 ? o1.getNum().compareTo(o2.getNum()) : result;
        return result;
    });
    private static TreeSet<Fruit> newFruits = new TreeSet<>((o1, o2) -> {
        int result = o2.getPrice() - o1.getPrice();
        result = result == 0 ? o1.getNum().compareTo(o2.getNum()) : result;
        return result;
    });
    //在静态代码块中调用读取的方法,用于初始化数据
    static {
        read();
    }
    //此方法用于记录水果的库存
    public void inventory(String fnum, int num, int[] arr) {
        for (int i = 0; i < fruits.size(); i++) {
            //获取编号对应的水果对象
            Fruit f = fruits.get(i);
            if (f.getNum().equals(fnum)) {
                //如果库存大于等于购买数量让数组中对应相同位置的索引记录购买量数据
                if (f.getInventory() >= num) {
                    arr[i] = num;
                    //用原始索引减去购买数
                    int j = f.getInventory() - num;
                    //使用set方法重置当前水果对象的库存值
                    f.setInventory(j);
                }
            }
        }
        reSave();
    }
    //已价格排序的方法
    public TreeSet<Fruit> sortByPrice() {
        return newFruits;
    }
    //已库存排序的方法
    public TreeSet<Fruit> sortByInventory() {
        return allFruits;
    }

    public static void read() {
        try {
            //用缓冲字符流读取保存在本地文件中的水果信息
            BufferedReader reader = new BufferedReader(new FileReader("myfruit-shop-info-manager\\fruit.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                String[] str = line.split(",");
                //将读取到的字符串数据用","切割,并封装到水果对象中
                Fruit f = new Fruit(str[0], str[1], Integer.parseInt(str[2]), Integer.parseInt(str[3]), str[4]);
                //将水果对象加入到集合中
                fruits.add(f);
            }
            //因为需要用到TreeSet集合排列数据,所以用addAll方法获取集合中已存入的数据
            allFruits.addAll(fruits);
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ArrayList<Fruit> findAllFruits() {
        return fruits;
    }
    //保存数据的方法
    public void reSave() {
        try {
            //创建缓冲字符输出流对象
            BufferedWriter bw = new BufferedWriter(new FileWriter("myfruit-shop-info-manager\\fruit.txt"));
            for (Fruit f : fruits) {
                //遍历集合将集合中的水果对象写到本地文件,用逗号隔开
                bw.write(f.getNum() + "," + f.getName() + "," + f.getPrice() + "," + f.getInventory() + "," + f.getUnit());
                bw.newLine();
            }
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void add(String num, String name, int price, int inventory, String unit) {
        Fruit f = new Fruit(num, name, price, inventory, unit);
        fruits.add(f);
        //将封装好的新增水果对象调用reSave()方法重新写道本地文件
        reSave();
    }
    //已用户编号删除数据的方法
    public void delete(String num) {
        int index = getIndex(num);
        if (index != -1) {
            fruits.remove(index);
            reSave();
        }
    }
    //已用户输入的编号来获取索引的方法
    public int getIndex(String num) {
        int index = -1;
        for (int i = 0; i < fruits.size(); i++) {
            Fruit f = fruits.get(i);
            if (f.getNum().equals(num)) {
                index = i;
            }
        }
        return index;
    }
    //已编号修改数据的方法,方法的参数包括用户输入的编号,以及封装好的新的水果对象
    public void update(String num, Fruit newFruit) {
        int index = getIndex(num);
        fruits.set(index, newFruit);
        reSave();
    }
}
